﻿//IStorageRegistry.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo.Storages
{
	using System;

	using StockSharp.Algo.Candles;
	using StockSharp.BusinessEntities;

	/// <summary>
	/// Интерфейс, описывающий хранилище маркет-данных.
	/// </summary>
	public interface IStorageRegistry
	{
		/// <summary>
		/// Хранилище, которое используется по-умолчанию.
		/// </summary>
		IMarketDataDrive DefaultDrive { get; }

		/// <summary>
		/// Получить хранилище тиковых сделок для заданного инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Хранилище тиковых сделок.</returns>
		IMarketDataStorage<Trade> GetTradeStorage(Security security);

		/// <summary>
		/// Получить хранилище тиковых сделок для заданного инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <param name="drive">Хранилище (база данных, файл и т.д.).</param>
		/// <returns>Хранилище тиковых сделок.</returns>
		IMarketDataStorage<Trade> GetTradeStorage(Security security, IMarketDataDrive drive);

		/// <summary>
		/// Получить хранилище стаканов для заданного инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Хранилище стаканов.</returns>
		IMarketDataStorage<MarketDepth> GetMarketDepthStorage(Security security);

		/// <summary>
		/// Получить хранилище стаканов для заданного инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <param name="drive">Хранилище (база данных, файл и т.д.).</param>
		/// <returns>Хранилище стаканов.</returns>
		IMarketDataStorage<MarketDepth> GetMarketDepthStorage(Security security, IMarketDataDrive drive);

		/// <summary>
		/// Получить хранилище лога заявок для заданного инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Хранилище лога заявок.</returns>
		IMarketDataStorage<OrderLogItem> GetOrderLogStorage(Security security);

		/// <summary>
		/// Получить хранилище лога заявок для заданного инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <param name="drive">Хранилище (база данных, файл и т.д.).</param>
		/// <returns>Хранилище лога заявок.</returns>
		IMarketDataStorage<OrderLogItem> GetOrderLogStorage(Security security, IMarketDataDrive drive);

		/// <summary>
		/// Получить хранилище изменений инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Хранилище изменений инструмента.</returns>
		IMarketDataStorage<SecurityChange> GetSecurityChangeStorage(Security security);

		/// <summary>
		/// Получить хранилище лога изменений инструмента.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <param name="drive">Хранилище (база данных, файл и т.д.).</param>
		/// <returns>Хранилище изменений инструмента.</returns>
		IMarketDataStorage<SecurityChange> GetSecurityChangeStorage(Security security, IMarketDataDrive drive);

		/// <summary>
		/// Получить хранилище изменений заявок.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <returns>Хранилище изменений заявок.</returns>
		IMarketDataStorage<OrderTraceItem> GetOrderTraceStorage(Security security);

		/// <summary>
		/// Получить хранилище лога изменений заявок.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <param name="drive">Хранилище (база данных, файл и т.д.).</param>
		/// <returns>Хранилище изменений заявок.</returns>
		IMarketDataStorage<OrderTraceItem> GetOrderTraceStorage(Security security, IMarketDataDrive drive);

		/// <summary>
		/// Получить хранилище свечек для заданного инструмента.
		/// </summary>
		/// <param name="candleType">Тип свечки.</param>
		/// <param name="security">Инструмент.</param>
		/// <param name="arg">Параметр свечки.</param>
		/// <returns>Хранилище свечек.</returns>
		IMarketDataStorage<Candle> GetCandleStorage(Type candleType, Security security, object arg);

		/// <summary>
		/// Получить хранилище свечек для заданного инструмента.
		/// </summary>
		/// <param name="candleType">Тип свечки.</param>
		/// <param name="security">Инструмент.</param>
		/// <param name="arg">Параметр свечки.</param>
		/// <param name="drive">Хранилище (база данных, файл и т.д.).</param>
		/// <returns>Хранилище свечек.</returns>
		IMarketDataStorage<Candle> GetCandleStorage(Type candleType, Security security, object arg, IMarketDataDrive drive);

		/// <summary>
		/// Получить хранилище маркет-данных.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		/// <returns>Хранилище маркет-данных.</returns>
		IMarketDataStorage GetStorage(Security security, Type dataType, object arg);

		/// <summary>
		/// Получить хранилище маркет-данных.
		/// </summary>
		/// <param name="security">Инструмент.</param>
		/// <param name="dataType">Тип маркет-данных.</param>
		/// <param name="arg">Параметр, ассоциированный с типом <paramref name="dataType"/>. Например, <see cref="Candle.Arg"/>.</param>
		/// <param name="drive">Хранилище.</param>
		/// <returns>Хранилище маркет-данных.</returns>
		IMarketDataStorage GetStorage(Security security, Type dataType, object arg, IMarketDataDrive drive);

		/// <summary>
		/// Зарегистрировать хранилище тиковых сделок.
		/// </summary>
		/// <param name="storage">Хранилище тиковых сделок</param>
		void RegisterTradeStorage(IMarketDataStorage<Trade> storage);

		/// <summary>
		/// Зарегистрировать хранилище стаканов.
		/// </summary>
		/// <param name="storage">Хранилище стаканов.</param>
		void RegisterMarketDepthStorage(IMarketDataStorage<MarketDepth> storage);

		/// <summary>
		/// Зарегистрировать хранилище лога заявок.
		/// </summary>
		/// <param name="storage">Хранилище лога заявок.</param>
		void RegisterOrderLogStorage(IMarketDataStorage<OrderLogItem> storage);

		/// <summary>
		/// Зарегистрировать хранилище изменений заявок.
		/// </summary>
		/// <param name="storage">Хранилище изменений заявок.</param>
		void RegisterOrderTraceStorage(IMarketDataStorage<OrderTraceItem> storage);

		/// <summary>
		/// Зарегистрировать хранилище изменений инструмента.
		/// </summary>
		/// <param name="storage">Хранилище изменений инструмента.</param>
		void RegisterSecurityChangeStorage(IMarketDataStorage<SecurityChange> storage);

		/// <summary>
		/// Зарегистрировать хранилище свечек.
		/// </summary>
		/// <param name="storage">Хранилище свечек.</param>
		/// <param name="candleType">Тип свечки.</param>
		/// <param name="arg">Параметр свечки.</param>
		void RegisterCandleStorage(IMarketDataStorage<Candle> storage, Type candleType, object arg);
	}
}